package JavaCollection;



import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

/**
 * @author Lenl
 * @version v1.0
 * @create 2021-06-04 23:48
 * @description List接口的使用
 * Collection:单列数据，存储一个一个对象
 *    List:有序可重复 -->“动态数组”
 *            |--ArrayList、LinkedList、Vector
 * 面试题：比较ArrayList、LinkedList、Vector异同
 *      同：三各类都实现了List接口，存储有序、可重复数据
 *      不同：ArrayList:作为List主要实现类，线程不安全的，效率高；底层使用Object[]存储
 *           LinkedList:低于频繁的插入、删除操作，此类效率比ArrayList高；底层使用的双向链表存储
 *           Vector:作为List的古老实现类，线程安全的，效率较低；底层使用Object[]存储
 *   2.ArrayList的源码分析：
 *    2.1jdk7情况下：
 *      ArrayList list=new ArrayList();//底层创建了长度为10的数组
 *      List.add(123);//elementData[0]=new Integer(123);
 *      ...
 *      List.add(1);//如果此次添加导致底层数组容量不足，则扩容
 *      //默认情况下扩容为原来的1.5倍，同时需要将原有数组复制到新的数组中
 *      结论：建议使用带参数的构造器：ArrayList list=new ArrayList(100)；//长度初始化为100
 *   2.2jdk8情况下：
 *      ArrayList list=new ArrayList();//底层Object[]初始化为{},并没有初始化
 *      初次add()才初始化。后续与jdk7无异
 *   小结：jdk7中的ArrayList相当于单例模式中的饿汉式，jdk8中的相当于懒汉式
 *
 *  3.LinkedList的源码分析：
 *      LinkedList list=new LinkedList();内部声明了Node类型的first和last属性，默认值为null
 *      list.add(123);//将123封装到Node中，创建了Node对象。
 *      其中，Node定义为：体现了LinkedList的双向链表的说法
 *  4.Vector:的源码分析
 *      jdk7与jdk8通过Vector()构造器创建对象时，底层都创建了长度为10的数组，扩容方面，默认扩容为原来的2倍。
 *
 * 5.List接口中的常用方法(如下)
 *      遍历：Iterator、foreach、for循环
 *
 */
public class ListTest {
    @Test
    public void test1(){
        ArrayList list=new ArrayList();
        list.add("123");
        list.add("ABC");
        list.add(999);
        list.add(new Person("张三"));
        list.add(456);
        System.out.println(list.toString());
        //void add(int index,object ele):指定位置插入
        list.add(1,"插入");
        System.out.println(list.toString());

        //boolean addAll(int index,Collection eles):从index位置开始添加eles中所有元素
        List list1= Arrays.asList(1,2,3);
        list.addAll(2,list1);
        System.out.println(list.toString());

        // Object get(int index):获取指定index位置的元素
        System.out.println(list.get(1));

        //int indexOf(Object obj):获取首次出现的位置
        System.out.println(list.indexOf(new Person("张三")));
        //int lastIndexOf()
        list.add("123");
        System.out.println(list.lastIndexOf("123"));
        System.out.println("*************");

        //remove(int index):移除指定索引位置的元素
        System.out.println(list.remove(2));
        System.out.println(list.toString());
        System.out.println(list.remove(new Integer(999)));
        System.out.println(list.toString());

        //Object set(int index,object obj) //修改
        System.out.println(list.set(1,666)); //返回被修改的元素
        System.out.println(list.toString());

        //subList(int fromIndex,int toIndex):返回左闭右开区间的子集合,原list并不改变
        List sub=list.subList(1,6);
        System.out.println(sub.toString());

    }
}
